//
//  ViewController.m
//  UI25_Work GCD
//
//  Created by dllo on 16/8/17.
//  Copyright © 2016年 yh. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (strong, nonatomic) IBOutlet UIImageView *picImageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self createGCDContent];
}
- (void)createGCDContent {
/**
    GCD是Grand Central Dispatch的缩写
    GCD是iOS开发中, 对于多核开发的一个较新的解决方法 它主要用于优化应用程序以支持多核处理器以及其他处理系统 他是一个在线程池模式的基础上执行的并行任务 
    GCD是一个替代NSThread等技术的很高效和强大的技术 他可以处理数据锁定和资源泄露等复杂异步编程问题 GCD的工作原理是让一个应用程序,根据可用的处理资源 安排他们在任何可用的处理器核心上平行排队执行特定的任务 这个任务可以是一个功能或者一个程序段
    GCD在一个很低的水平处理线程 他不需要程序员关注太多的细节 它创建的队列是轻量级的 创建中需要较少的指令
 1、调度队列
 所有的调度队列都是先进先出队列，因此，队列中的任务的开始的顺序和添加到队列中的顺序相同。GCD自动的为我们提供了一些调度队列，我们也可以创建新的用于具体的目的。
 下面列出几种可用的调度队列类型以及如何使用。
 2、调度资源
 它是一个监视某些类型事件的对象。当这些事件发生时，它自动将一个block放入一个调度队列的执行例程中。
 3、调度组
 允许将多任务分组来方便后来加入执行。任务能作为一个组中的一个成员被加到队列中，客户端能用这个组对象来等待直到这个组中的所有任务完成。
 4、调度信号量
 允许客户端并行发布一定数量的任务。
*/
    // 1. 声明一个队列
    dispatch_queue_t myQueue = dispatch_queue_create("djdk", NULL);
    // 2. 执行一个队列(异步)
    dispatch_async(myQueue, ^{
        [self createImage];
    });
    dispatch_queue_t secQueue = dispatch_queue_create("yuHan", NULL);
    dispatch_group_t group = dispatch_group_create();
    // 1.
    dispatch_group_async(group, secQueue, ^{
        NSLog(@"1 begin");
        NSLog(@"1 end");
    });
    // 2.
    dispatch_group_async(group, secQueue, ^{
        NSLog(@"2 begin");
        NSLog(@"2 end");
    });
    // 3.
    dispatch_group_async(group, secQueue, ^{
        NSLog(@"3 begin");
        NSLog(@"3 end");
    });
    NSLog(@"1 2 3 finished");
    
    
    // 4.
    dispatch_group_async(group, secQueue, ^{
        NSLog(@"小坏蛋啊");
        NSLog(@"雨在下 你听得见吗");
    });

    
    
}
- (void)createImage {
    // 在子线程中获取数据
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
    // 获取主线程 在主线程中给imageView赋值
    dispatch_async(dispatch_get_main_queue(), ^{
        [self handleImageData:(NSData *)data];
    });

}

- (void)handleImageData:(NSData *)data {
    self.picImageView.image = [UIImage imageWithData:data];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
